#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
/*
  #include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    功能：从stream指向的文件中，读取nmemb项数据，每一项的大小为size，将整个结果放入ptr指向的容器中
    参数1：容器指针，是一个void*类型，表示可以存储任意类型的数据
    参数2：要读取数据每一项的大小
    参数3：要读取数据的项数
    参数4：文件指针
    返回值：成功返回nmemb,就是成功读取的项数，失败返回小于项数的值，或者是0

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
    功能：向stream指向的文件中写入nmemb项数据，每一项的大小为size，数据的起始地址为ptr
    参数1：要写入数据的起始地址
    参数2：每一项的大小
    参数3：要写入的总项数
    参数4：文件指针
    返回值：成功返回写入的项数，失败返回小于项数的值，或者是0
*/

// 定义一个学生信息
class Stu
{
public:
    char name[20];
    int age;
    double score;
};

int main(int argc, const char *argv[])
{
    // 字符串的读写
    // 定义文件指针，以只写的形式打开文件
    FILE *fp = NULL;
    if ((fp = fopen("./test.txt", "w")) == NULL)
    {
        perror("fopen error");
        return -1;
    }
    // 定义要存储的字符串
    char wbuf[128] = "";
    while (1)
    {
        // 提示从终端上输入字符串
        printf("请输入>>>");
        fgets(wbuf, sizeof(wbuf), stdin); // 从标准输入中读取数据

        // 判断输入的是否为 quit
        if (strcmp(wbuf, "quit\n") == 0)
        {
            break;
        }
        // 将字符串写入文件
        fwrite(wbuf, strlen(wbuf), 1, fp); // 将字符串以每个字符串为单位写入文件，每次写一项
        // 刷新缓冲区
        fflush(fp);
        printf("录入成功\n");
    }
    // 关闭文件
    fclose(fp);
    // 再次以只读的形式打开文件
    if ((fp = fopen("./test.txt", "r")) == NULL)
    {
        perror("fopen error");
        return -1;
    }
    char rbuf[10] = "";
    int res = fread(rbuf, 1, sizeof(rbuf), fp); // 从文件中读取一个字符串
    fwrite(rbuf, 1, res, stdout);               // 向标准输出中写入数据
    // 关闭文件
    fclose(fp);
    //------------------------------------------------------------------
    // 整数的读写
    // 定义文件指针，以只写的形式打开文件
    if ((fp = fopen("./test.txt", "w")) == NULL)
    {
        perror("fopen error");
        return -1;
    }
    // 定义要写入文件中的数据
    int num = 16;
    // 将数据写入文件中
    fwrite(&num, sizeof(num), 1, fp); // 将num中的数据写入fp指向的文件中

    // 关闭文件
    fclose(fp);
    // 再次以只读的形式打开文件
    if ((fp = fopen("./test.txt", "r")) == NULL)
    {
        perror("fopen error");
        return -1;
    }
    // 定义接收数据的变量
    int key = 0;
    // 从文件中读取数据
    fread(&key, sizeof(key), 1, fp);
    // 关闭文件
    fclose(fp);
    printf("key = %d\n", key);
    //-----------------------------------------------------------
    // 结构体的读写
    if ((fp = fopen("./test.txt", "w")) == NULL)
    {
        perror("fopen error");
        return -1;
    }
    // 定义三个学生
    Stu s[3] = {{"张三", 18, 98},
                {"李四", 20, 88},
                {"王五", 16, 95}};
    // 将三个学生信息写入文件中
    fwrite(s, sizeof(Stu), 3, fp);
    // 关闭文件
    fclose(fp);
    // 再次以只读的形式打开文件
    if ((fp = fopen("./test.txt", "r")) == NULL)
    {
        perror("fopen error");
        return -1;
    }
    // 定义一个对象，接收读取的结果
    Stu temp;
    // 从文件中读取一个学生的信息
    fread(&temp, sizeof(Stu), 1, fp);
    // 将读取的数据展示出来
    printf("name:%s, age:%d, score:%.2lf\n", temp.name, temp.age, temp.score);
    // 关闭文件
    fclose(fp);

    return 0;
}